Bug 659406 - Abstract what triggers a context menu
authorMichael Natterer <mitch@lanedo.com>
Tue, 27 Sep 2011 13:37:28 +0000 (15:37 +0200)
committerMichael Natterer <mitch@gimp.org>
Tue, 27 Sep 2011 13:45:18 +0000 (15:45 +0200)
Add gdk_event_triggers_context_menu(), using the new modifier
abstraction API. Remove _gtk_button_event_triggers_context_menu()
and port all callers.

15 files changed:
gdk/gdkevents.c
gdk/gdkevents.h
gtk/gtkcolorsel.c
gtk/gtkentry.c
gtk/gtkfilechooserdefault.c
gtk/gtklabel.c
gtk/gtklinkbutton.c
gtk/gtkmain.c
gtk/gtkmountoperation.c
gtk/gtknotebook.c
gtk/gtkprivate.h
gtk/gtkrecentchooserdefault.c
gtk/gtkstatusicon.c
gtk/gtktextview.c
gtk/gtktoolbar.c

index ae42b4ffa4d3434ae06e6e5e663949c0906bf7f7..eeaac2dccc000c3fa8d85f02ee18aa578cc6f8d2 100644 (file)
@@ -1448,6 +1448,56 @@ gdk_event_request_motions (const GdkEventMotion *event)
     }
 }
 
+/**
+ * gdk_event_triggers_context_menu:
+ * @event: a #GdkEvent, currently only button events are meaningful values
+ *
+ * This function returns whether a #GdkEventButton should trigger a
+ * context menu, according to platform conventions. The right mouse
+ * button always triggers context menus. Additionally, if
+ * gdk_keymap_get_modifier_mask() returns a non-0 mask for
+ * %GDK_MODIFIER_INTENT_CONTEXT_MENU, then the left mouse button will
+ * also trigger a context menu if this modifier is pressed.
+ *
+ * This function should always be used instead of simply checking for
+ * event->button == 3.
+ *
+ * Returns: %TRUE if the event should trigger a context menu.
+ *
+ * Since: 3.4
+ **/
+gboolean
+gdk_event_triggers_context_menu (const GdkEvent *event)
+{
+  g_return_val_if_fail (event != NULL, FALSE);
+
+  if (event->type == GDK_BUTTON_PRESS)
+    {
+      const GdkEventButton *bevent = (const GdkEventButton *) event;
+      GdkDisplay *display;
+      GdkModifierType modifier;
+
+      g_return_val_if_fail (GDK_IS_WINDOW (bevent->window), FALSE);
+
+      if (bevent->button == 3 &&
+          ! (bevent->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
+        return TRUE;
+
+      display = gdk_window_get_display (bevent->window);
+
+      modifier = gdk_keymap_get_modifier_mask (gdk_keymap_get_for_display (display),
+                                               GDK_MODIFIER_INTENT_CONTEXT_MENU);
+
+      if (modifier != 0 &&
+          bevent->button == 1 &&
+          ! (bevent->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
+          (bevent->state & modifier))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 static gboolean
 gdk_events_get_axis_distances (GdkEvent *event1,
                                GdkEvent *event2,
index 8bf7d565d62c03db207e923ebaae5b417bf8b4b2..24a3b8ea4b19f0fd6dadc5d3152506fef1b1601b 100644 (file)
@@ -1076,7 +1076,8 @@ GdkDevice* gdk_event_get_device         (const GdkEvent  *event);
 void       gdk_event_set_source_device  (GdkEvent        *event,
                                          GdkDevice       *device);
 GdkDevice* gdk_event_get_source_device  (const GdkEvent  *event);
-void      gdk_event_request_motions     (const GdkEventMotion *event);
+void       gdk_event_request_motions    (const GdkEventMotion *event);
+gboolean   gdk_event_triggers_context_menu (const GdkEvent *event);
 
 gboolean  gdk_events_get_distance       (GdkEvent        *event1,
                                          GdkEvent        *event2,
index 3b8f048d0845d0223ecf0c141e24981589045410..d66067209bc467df879feba7674ea81e44dd798b 100644 (file)
@@ -1505,7 +1505,7 @@ palette_press (GtkWidget      *drawing_area,
 
   gtk_widget_grab_focus (drawing_area);
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       do_popup (colorsel, drawing_area, event->time);
       return TRUE;
index c22cb0eaf8486cd7ceb2940ec64424c989c879da..180646425bbe4e1c050ba8d112a333b788731bf3 100644 (file)
@@ -3774,7 +3774,7 @@ gtk_entry_button_press (GtkWidget      *widget,
 
   tmp_pos = gtk_entry_find_position (entry, event->x + priv->scroll_offset);
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       gtk_entry_do_popup (entry, event);
       priv->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */
index 8c3db4cb9456a577967bd5ff7df07c7ff3fac099..896b8781d4bd0bf0bd1d2824fc57127b41129d64 100644 (file)
@@ -3448,7 +3448,7 @@ shortcuts_button_press_event_cb (GtkWidget             *widget,
   if (in_press)
     return FALSE;
 
-  if (!_gtk_button_event_triggers_context_menu (event))
+  if (!gdk_event_triggers_context_menu ((GdkEvent *) event))
     return FALSE;
 
   in_press = TRUE;
@@ -4300,7 +4300,7 @@ list_button_press_event_cb (GtkWidget             *widget,
   if (in_press)
     return FALSE;
 
-  if (!_gtk_button_event_triggers_context_menu (event))
+  if (!gdk_event_triggers_context_menu ((GdkEvent *) event))
     return FALSE;
 
   in_press = TRUE;
index 00422a53476516015ca1dcce2a84c4bcbb797a62..35467490fd0e162b32d8f029a3abbd3d1751f05b 100644 (file)
@@ -4715,7 +4715,7 @@ gtk_label_button_press (GtkWidget      *widget,
 
   if (info->active_link)
     {
-      if (_gtk_button_event_triggers_context_menu (event))
+      if (gdk_event_triggers_context_menu ((GdkEvent *) event))
         {
           info->link_clicked = 1;
           gtk_label_do_popup (label, event);
@@ -4734,7 +4734,7 @@ gtk_label_button_press (GtkWidget      *widget,
   info->in_drag = FALSE;
   info->select_words = FALSE;
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       gtk_label_do_popup (label, event);
 
index 0fdcbeab25cf6856b4b91e782bc18c71d14fcac2..ffa89c086fc0d5295c99f1aec2a23eb0a4c1bc8c 100644 (file)
@@ -522,10 +522,10 @@ gtk_link_button_button_press (GtkWidget      *widget,
   if (!gtk_widget_has_focus (widget))
     gtk_widget_grab_focus (widget);
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), event);
-      
+
       return TRUE;
     }
 
index e42f7303927d3303d266dfdd9b813465682846f5..a0ca89dfb5e3c084fd15c9d01d3e16eaeba11448 100644 (file)
@@ -2643,23 +2643,3 @@ _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint,
 
   return continue_emission;
 }
-
-gboolean
-_gtk_button_event_triggers_context_menu (GdkEventButton *event)
-{
-  if (event->type == GDK_BUTTON_PRESS)
-    {
-      if (event->button == 3 &&
-          ! (event->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
-        return TRUE;
-
-#ifdef GDK_WINDOWING_QUARTZ
-      if (event->button == 1 &&
-          ! (event->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
-          (event->state & GDK_CONTROL_MASK))
-        return TRUE;
-#endif
-    }
-
-  return FALSE;
-}
index dea21f54917053fc6245d0cfeb5f5d937df8f82e..c1ad3dac3d07d049d412d461a093695393202fc6 100644 (file)
@@ -1167,7 +1167,7 @@ on_button_press_event_for_process_tree_view (GtkWidget      *widget,
 
   ret = FALSE;
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gtk_button_event_triggers_context_menu (event))
     {
       ret = do_popup_menu_for_process_tree_view (widget, event, op);
     }
index afc51d35c994e9c43144a32a2671eb3c18df5cae..8ea2c6c9aa706388da477944667a51318a4000f2 100644 (file)
@@ -2858,7 +2858,7 @@ gtk_notebook_button_press (GtkWidget      *widget,
   if (arrow)
     return gtk_notebook_arrow_button_press (notebook, arrow, event->button);
 
-  if (priv->menu && _gtk_button_event_triggers_context_menu (event))
+  if (priv->menu && gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       gtk_menu_popup (GTK_MENU (priv->menu), NULL, NULL,
                       NULL, NULL, 3, event->time);
index 0def8c12eed6ada89f7d28bc8e74a1dfd03a70fc..458a4b95aefe6a5f5c2c1f71923668e1db11fac5 100644 (file)
@@ -83,8 +83,6 @@ void    _gtk_modules_init             (gint          *argc,
 void    _gtk_modules_settings_changed (GtkSettings   *settings,
                                        const gchar   *modules);
 
-gboolean _gtk_button_event_triggers_context_menu (GdkEventButton *event);
-
 G_END_DECLS
 
 #endif /* __GTK_PRIVATE_H__ */
index 7adc1aebd6ae4dcd6e9d70e0e51cb685c8c8287c..160b37f0a44802f514278d7c9d9ea77182b92af6 100644 (file)
@@ -74,8 +74,6 @@
 #include "gtkrecentchooserutils.h"
 #include "gtkrecentchooserdefault.h"
 
-#include "gtkprivate.h"
-
 
 enum 
 {
@@ -1905,7 +1903,7 @@ recent_view_button_press_cb (GtkWidget      *widget,
 {
   GtkRecentChooserDefault *impl = GTK_RECENT_CHOOSER_DEFAULT (user_data);
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       GtkTreePath *path;
       gboolean res;
index 27a2b144d97c7fa4cbb4b8ce53edab036d6d697c..4f4dfb86aaaacc9a7947142c81107e90152befe4 100644 (file)
@@ -1810,7 +1810,7 @@ gtk_status_icon_button_press (GtkStatusIcon  *status_icon,
   if (handled)
     return TRUE;
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       emit_popup_menu_signal (status_icon, event->button, event->time);
       return TRUE;
index e128c3a14d6a5eab438c2f0f4f7099c4059c04f1..a2e5020b3d437b43b7f03264142e46a69a102725 100644 (file)
@@ -4545,7 +4545,7 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
     {
       gtk_text_view_reset_im_context (text_view);
 
-      if (_gtk_button_event_triggers_context_menu (event))
+      if (gdk_event_triggers_context_menu ((GdkEvent *) event))
         {
          gtk_text_view_do_popup (text_view, event);
          return TRUE;
index dd3d05ef777221d4c035c023bc40c42c41d671f1..ba6ccb5c16216aeceb25421592d32371c37bebae 100644 (file)
@@ -2748,7 +2748,7 @@ gtk_toolbar_button_press (GtkWidget      *toolbar,
 {
   GtkWidget *window;
 
-  if (_gtk_button_event_triggers_context_menu (event))
+  if (gdk_event_triggers_context_menu ((GdkEvent *) event))
     {
       gboolean return_value;